import java.util.HashMap;
import java.util.Scanner;

/**
 * Class Room - a room in an adventure game.  
 *
 * A "Room" represents one location in the scenery of the game.  It is 
 * connected to other rooms via exits.  The exits are labelled north, 
 * east, south, west.  For each direction, the room stores a reference
 * to the neighboring room, or null if there is no exit in that direction.
 * 
 */
public class Room {
	private HashMap<String, Room> exits = new HashMap<String, Room>();
	private String description;
	private int categorie;
	private Game game;
	private boolean adversaireBattu = false, explore = false;
	private int pointDeVie = 10;
	private Ascii ascii = new Ascii();

	/**
	 * Create a room described "description". Initially, it has
	 * no exits. "description" is something like "a kitchen" or
	 * "an open court yard".
	 * @param description The room's description.
	 * @param cat Definie la categorie de la piece.
	 */
	public Room(String description, int cat)    {
		this.description = description;
		this.categorie = cat;
	}

	/**
	 * Create a room described "description". Initially, it has
	 * no exits. "description" is something like "a kitchen" or
	 * "an open court yard".
	 * @param description The room's description.
	 * @param cat Definie la categorie de la piece.
	 * @param game Reference sur l'instance de Game courrante.
	 */
	public Room(String description, int cat, Game game)    {
		this.description = description;
		this.categorie = cat;
		this.game = game;
	}

	/**
	 * Retourn la reference vers la sortie choisie si elle existe.
	 *
	 * @param direction Point cardinal choisi par le joueur.
	 * @return Reference vers la sortie.
	 */
	public Room getExit(String direction) {
		Room exit = null;
		if (this.exits.containsKey(direction))
			exit = this.exits.get(direction);
		return exit;
	}

	/**
	 * Definie une sortie possible pour une piece donnee.
	 *
	 * @param direction Point cardinal par rapport a la piece courrante.
	 * @param neighbor Reference vers la piece correspondante.
	 */
	public void setExit(String direction, Room neighbor) {
		this.exits.put(direction, neighbor);
	}

	/**
	 * @return The description of the room.
	 */
	public String getDescription() {
		return this.description;
	}

	public String getLongDescription() {
		return this.description + "\n" + this.getExitString() ;
	}

	/**
	 * Liste les issues possibles.
	 */
	public String getExitString () {
		String ret = "";
		ret = "Pieces attenantes : ";
		//--------------------------------------------
		if (this.exits.containsKey("Nord") == true)
			ret += this.exits.get("Nord").getDescription() + " | ";
		if (this.exits.containsKey("Sud") == true)
			ret += this.exits.get("Sud").getDescription() + " | ";
		if (this.exits.containsKey("Est") == true)
			ret += this.exits.get("Est").getDescription() + " | ";
		if (this.exits.containsKey("Ouest") == true)
			ret += this.exits.get("Ouest").getDescription();
		//--------------------------------------------
		ret +=  "\n" + "Choix possibles :";
		//--------------------------------------------
		for (String y : this.exits.keySet()) {
			ret += " " + y;
		}
		//--------------------------------------------
		return ret + "\n";
	}

	/**
	 * Explore la piece courrante.
	 *
	 * @param item Liste des items que je joueur a en sa possession.
	 * @return La valeur de l'item si la piece en contenai un.
	 */
	public String explore(String[] item) {
		String temp = null;
		switch (this.categorie) {
			case 0:  //Rien
				System.out.println("Vous ne trouvez rien de pertinant pour votre aventure :).");
				break;

			case 1: //Combat
				String adv = "";
				int pvAdv = 0;
				System.out.println(this.description);
				switch (this.description) {
					case "2eme cellule":
						adv = "Squelette";
						pvAdv = 5;
						break;
					case "Dortoir des gardes":
						adv = "Garde";
						pvAdv = 8;
						break;
					case "Toilettes du donjon":
						adv = "Araignee";
						pvAdv = 3;
						break;
				}
				if (!(this.combat(adv, pvAdv))) {
					this.game.reset();
				}
				break;

			case 2: //Tresor
				if (!this.explore) {
					System.out.println("Bravo, vous avez trouvez un tresor pendant votre exploration <3 !");
					System.out.println("Vous trouvez :");
					switch (this.description) {
						case "3eme cellule":
							this.ascii.bague();
							System.out.println("Une bague en argent au doigt d'un squelette au fond de la cellule encore enchaine.");
							temp = "Bague";
							this.explore = true;
							this.game.setPV(this.game.getPV() + 2);
							break;
						case "Avant garde":
							this.ascii.epee();
							System.out.println("Une arme qu'un soldat saoul a du oublier...");
							temp = "Arme";
							this.explore = true;
							this.game.setArme(true);
							break;
						case "Garde manger":
							this.ascii.pomme();
							System.out.println("Une pomme et une bouteille d'une substance inconnue.");
							temp = "Une pomme et une bouteille";
							this.explore = true;
							this.game.setPV(this.game.getPV() + 3);
							break;
						case "Salle des trophees":
							this.ascii.graal();
							System.out.println("le Saint Graal mais vous en savez pas quoi en faire...");
							temp = "Saint Graal";
							this.explore = true;
							break;
					}
				}
				break;

			case 3: //Boss final
				break;

			case 4: //Magicien (retour départ)
				this.ascii.wizard();
				System.out.println("Pas de chance. Le magicien vous a vu et vous jette un sort.");
				System.out.println("Vous perdez connaissance...\n");
				System.out.println("Vous vous reveillez de nouveau dans la cellule avec vos poches vides.");
				this.game.reset();
				break;

			case 5: //Chambre du roi (combat + cle pour sortir)
				if (!(this.adversaireBattu)) {
					System.out.println("Vous apercevez une personne qui semble etre le maitre de ce donjon.");
					System.out.println("Elle porte une cle en pendentif a son collier. Mais il ne semble pas pret a vous la ceder.");
					System.out.println("Vous allez devoir l'affronter...");
					System.out.println("Etes-vous pret ?");
					Scanner reader = new Scanner(System.in);
					String inputLine = reader.nextLine();
					if (inputLine.equals("non")) {
						System.out.println("Vous repartez discretement mais vous allez sans doute devoir y revenir plus tard...");
					}
					else {
						if (this.game.getArme() == false) {
							System.out.println("Vous vous approchez de ce personnage...");
							System.out.println("Vous saississez ce qui vous passe sous la main. Vous etes donc arme maintenant d'une plume d'oie...");
							System.out.println("Il vous entend, se retrourne et vous decapite sur le coup...");
							System.out.println("Reessayez avec une meilleure arme la prochaine fois :).");
							this.game.reset();
						}
						else {
							if (this.combat("Roi", 12)) {
								System.out.println(" .--.");
								System.out.println("/.-. '----------.");
								System.out.println("\\'-' .--\"--\"\"-\"-'");
								System.out.println(" '--'");
								temp = "cle";
							}
							else
								this.game.reset();
						}
					}
				}
				break;

			case 6: //Histoire du jeu
				System.out.println("-------------------------------------");
				System.out.println("| .   .         .                   |");
				System.out.println("| |   |  o     _|_      o           |");
				System.out.println("| |---|  .  .--.|  .-.  .  .--..-.  |");
				System.out.println("| |   |  |  `--.| (   ) |  |  (.-'  |");
				System.out.println("| '   '-' `-`--'`-'`-'-' `-'   `--' |");
				System.out.println("-------------------------------------");
				System.out.println("");
				System.out.println("Vous ne savez plus qui vous etes.\n\nLes derniers souvenirs que vous avez sont des visages flous vous trainant\nle long du couloir que vous pouvez " +
									"apercevoir par la fenetre de la porte de votre cellule.\nIls vous ont ensuite jeter dans la cellule ou vous etes.");
				System.out.println("Vous n'avez plus aucun de vos objets personnel.\nExcepte, un collier avec une pierre precieuse sur laquelle est grave quelque chose\n" +
									"que vous n'arrivez pas a lire du a l'usure.");
				System.out.println("");
				break;
			case 7: //EasterEgg
				System.out.println("-------------------------------------------");
				System.out.println("| .---.         .          .---.          |");
				System.out.println("| |            _|_         |              |");
				System.out.println("| |--- .-.  .--.|  .-. .--.|--- .-.. .-.. |");
				System.out.println("| |   (   ) `--.| (.-' |   |   (   |(   | |");
				System.out.println("| '---'`-'`-`--'`-'`--''   '---'`-`| `-`| |");
				System.out.println("|                               ._.' ._.' |");
				System.out.println("-------------------------------------------");
				break;
		}
		return temp;
	}

	public boolean combat(String adversaire, int pvAdv) {
		int pvAdversaire = pvAdv;
		int pvPerso = this.game.getPV();
		boolean ret = false, shield = this.game.getShield();
		if (!(this.adversaireBattu)) {
			System.out.println("Un combat s'engage.");
			System.out.println("Vous vous retrouvez face a : " + adversaire);
			switch (adversaire) {
				case "Araignee":
					this.ascii.araignee();
					break;
				case "Squelette":
					this.ascii.squellette();
					break;
				case "Garde":
					this.ascii.garde();
					break;
				case "Dragon":
					this.ascii.dragon();
					break;
			}
			if (this.game.getArme() == false) {
				System.out.println("Vous n'avez pas d'armes pour combattre. Cela va etre plus dur.\n");
			}
			if (adversaire.equals("Dragon")) {
				System.out.println("Vous affrontez le boss le final. Preparez-vous a un rude combat.\n");
			}
			while ((pvAdversaire > 0)&&(pvPerso > 0)) {
				double degats = Math.random();
				if (this.game.getArme()) {
					degats = degats * 30;
				}
				else {
					degats = degats * 10;
				}
				double degatsAdv = (Math.random() * 11);
				if (degats > degatsAdv) {
					System.out.println("Vous lui infligez 1 PV de dommage.");
					pvAdversaire--;
				}
				else {
					double esquive = Math.random();
					if ((shield)&&(esquive > 0.8)) {
						System.out.println("Vous parrez l'attaque grace a votre bouclier. Merci la fee clochette <3.");
					}
					else {
						System.out.println(adversaire + " vous inflige 1 PV de dommage.");
						pvPerso--;
					}
				}
				System.out.println("\nPV joueur : " + pvPerso + " | Degats : " + degats);
				System.out.println("PV adversaire : " + pvAdversaire + " | Degats : " + degatsAdv + "\n");
			}
			if (pvPerso <= 0) {
				System.out.println("Vous avez perdu le combat.\n" + "Game over.");
				ret = false;
			}
			else {
				System.out.println("Vous avez remporte le combat. Felicitations !");
				ret = true;
				this.adversaireBattu = true;
			}
		}
		else {
			ret = true;
			System.out.println("Il ne reste que le cadavre de votre adversaire.");
		}
		return ret;
	}

	public boolean enigme() {
		boolean ret = false;
		int reponseBonne = 0;
		this.ascii.fee();
		Scanner reader = new Scanner(System.in);
		System.out.println("\n\n 		BRAVO - TU AS TROUVE L'ENIGME CACHE");
		System.out.println("Si tu y reponds bien, peut-etre que la fee qui garde son tresor te laissera passer...");
		System.out.println("Cette enigme se compose de trois questions qui sont les suivantes :");
		System.out.println("\nQuelle est la reponse a cette grande question :");
		System.out.println("	La Grande Question sur la vie, l'univers et le reste");
		String inputLine = reader.nextLine();
		if (inputLine.equals("42")) {
			System.out.println("C'est bien tu connais tes references <3");
			reponseBonne++;
		}
		else
			System.out.println("Va lire de suite H2G2!");
		System.out.println("Bon, passons a la deuxieme question.");
		System.out.println("Comment s'apelle le celebre jeu de tennis de table qui est sortie en 1967 sur borne d'arcade ?");
		inputLine = reader.nextLine();
		if ((inputLine.equals("Pong"))||(inputLine.equals("pong"))) {
			System.out.println("On ne peut pas l'oublier celui-la.");
			reponseBonne++;
		}
		else
			System.out.println("Il n'est jamais trop tard pour apprendre.");
		System.out.println("Et enfin, la derniere question.");
		System.out.println("Quel est le prenom du celebre pinguin :");
		inputLine = reader.nextLine();
		if ((inputLine.equals("Tux"))||(inputLine.equals("tux"))) {
			System.out.println("Le roi des Tuc *sort*.");
			reponseBonne++;
		}
		switch (reponseBonne) {
			case 0:
				System.out.println("Ahlala, on va dire que tu feras mieux pour ta prochaine partie :).");
				break;
			case 1:
				System.out.println("C'est bien mais je suis sur que tu peux faire mieux ;).");
				break;
			case 2:
				System.out.println("Tu y es presque. C'est sans doute pour la prochaine fois <3.");
				break;
			case 3:
				System.out.println("Bravo. Tu as reussi a repondre correctement a ces trois enigmes.\nElles etaient pas tres dures aussi. Enfin, pour ceux qui ont un minimum de culture Geek.");
				ret = true;
				break;
		}
		return ret;
	}
}